/*
            井子棋
            1.重复判断
            2.平局判断



*/




#include<stdio.h>
#include<string.h>

// void pfwell(char a[][5]){
//     for(int i=0;i<5;i++){
//         for(int j=0;j<5;j++){
//            a[i][j]=' ';
//         }
//     }
//     for(int i=1;i<5;i+=2){
//         for(int j=0;j<5;j++){
//            a[i][j]='-';
//         }
//     }
//     for(int i=0;i<5;i++){
//         for(int j=1;j<5;j+=2){
//             a[i][j]='|';
//         }
//     }
//       for(int i=0;i<5;i++){
//         for(int j=0;j<5;j++){
//             printf("%c",a[i][j]);
//         }
//         printf("\n");
//     }
// }


void clear(char a[][3]){
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
           a[i][j]=' ';
        }
    }
}

//打印棋盘
void pfwell(char a[][3]){
    printf("  0 1 2\n");
    for(int i=0;i<3;i++){
        printf("%d ",i);
        for(int j=0;j<3;j++){
            if(j==2){
                printf("%c",a[i][j]);
            }
            else{
            printf("%c|",a[i][j]);
            }
        }
        printf("\n");
        if(i<=1){
            printf("  ——————");  
        }
         printf("\n");  
    }
}

//下棋
void chess(char a[][3],char player1,char player2,int step,int *prei,int *prej){

    int i,j;
    
    if(step%2==1){
        printf("player1请输入:");
        scanf("%d,%d",&i,&j);
        if(step>1){
        while(i==*prei && j==*prej){
            printf("输入重复,player1请重新输入:");
            scanf("%d,%d",&i,&j);
        }
    }
        while(((i>=0 && i<=2) && (j>=0 && j<=2))==0){
            printf("输入错误,player1请重新输入:");
            scanf("%d,%d",&i,&j);
        }
        a[i][j]=player1;
    }
    else{
        printf("player2请输入:");
        scanf("%d,%d",&i,&j);
        while(i==*prei && j==*prej){
            printf("输入重复,player2请重新输入:");
            scanf("%d,%d",&i,&j);
        }
        while(((i>=0 && i<=2) && (j>=0 && j<=2))==0){
            printf("输入错误,player2请重新输入:");
            scanf("%d,%d",&i,&j);
        }
        a[i][j]=player2;
    }
    *prei=i;
    *prej=j;
}

//判断游戏
int endgame(char a[][3], int step, char *sym){   
   
    int end = 0;
    
    for(int i=0;i<3;i++){
        for(int j=0;j<2;j++){

            if(a[i][j]==' '){
                break;
            }
            else{
                if(a[i][j]!=a[i][j+1]){
                    end=0;
                    break;
                }
                else{
                    *sym=a[i][j];
                    end=1;
                }
                // if(end==1){                        //关于返回结尾返回判断end这里，要每一行，列完了之后就要判断一次，而不是双重循环里，两个比较完才判断一次
                //     return 1;    
                // }
            }
           // printf("%d %c %c %d\n",step,a[i][j],a[i][j+1],end);
        }

        if(end==1){
         return 1;    
        }
    }
        // if(end==1){                              //这里三行判断完才判断end，会报错，因为    0      end会是最后两个数比较的值，end=0；无法正确判断
        //      return 1;                                                                 * * *
        // }                                                                              0 0
    
   

    for(int j=0;j<3;j++){
        for(int i=0;i<2;i++){
            if(a[i][j]==' '){
                break;
            }
            else{
                if(a[i][j]!=a[i+1][j]){
                    end=0;
                    break;
                }
                else{
                    *sym=a[i][j];
                    end=1;
                }
            }
        }
        if(end==1){
            return 1;
        }
    }
    
    

    for(int i=0;i<2;i++){
            if(a[i][i]==' '){
                    break;
                }
            else{
                if(a[i][i]!=a[i+1][i+1]){
                    end=0;
                    break;
                }
                else{
                *sym=a[i][i];
                end=1;
                }
            }  
        // if(end==1){             //只能比较两个数，无法正确判断
        //     return 1;
        // } 
         
}  
    if(end==1){
        return 1;
    } 
 
   

    for(int i=0;i<2;i++){
        if(a[i][2-i]==' '){
                break;
            }
        else{
            if(a[i][2-i]!=a[i+1][1-i]){
                    end=0;
                    break;
                }
            else{
                *sym=a[i][2-i];
                    end=1;
                }
        }
        
    }
        if(end==1){
            return 1;
        }
         
    

    // if(step<10){
    //     if(end==1){
    //         return 1;
    //     }
    //     else if(end==0){
    //         return 0;
    //     }
    // }

    return 0;
}

int main(){
    char a[3][3];
    char player1,player2;
    int step=1;
    char sym;
    int end;
    char c[10];
    int again=1;
    int prei,prej;
    int grade1=0,grade2=0;


    printf("请输入玩家1,玩家2代号:\n");
    scanf("%c %c",&player1,&player2);
    
    while(again!=0){
        step=1;
        clear(a);
        pfwell(a);
        end=endgame(a,step,&sym);

        while(end!=1){ 
            if(step==10){
                break;
            }
            chess(a,player1,player2,step,&prei,&prej);
            pfwell(a);
            
            end=endgame(a,step,&sym);
            //printf("%d %d\n",end,step);
            step++;
        }

       if (end==1){                                            //if和else if交换就可以修复下完获胜但是平局的bug，先判end，再判step
            if(sym==player1){
                grade1++;
                printf("player1:%c 赢\n",player1);
                printf("目前分数: player1 : player2\n");
                printf("            %d   :      %d\n",grade1,grade2);
            }
            else if(sym==player2){
                grade2++;
                printf("player2:%c 赢\n",player2);
                printf("目前分数: player1 : player2\n");
                printf("            %d   :     %d\n",grade1,grade2);
            }
        }
        else if(step==10){
            printf("平局\n");
        }
        
        printf("\n");
        printf("还要再来一局吗?\n");
        scanf("%s",c);
        if(strcmp(c,"yes")==0){
            again=1;
        }
        else{
            again=0;
        }
}

    return 0;
}
